<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>

<body>
  <script>
    //原型属性
    const obj = Object.create({
      bar: 'bar',
    })
    //对象自身可枚举属性
    obj.foo = 'foo'
    //对象自身不可枚举属性
    Object.defineProperty(obj, 'name', {
      enumerable: false,
      value: 'kingx',
    })
    //symbol属性
    obj[Symbol('age')] = 'age'

    //遍历出来了自身枚举属性和原型链上的可枚举属性
    for (let k in obj) {
      // console.log(obj[k])
    }
    // console.log(obj)

    function Person(name) {
      this.name = name
    }

    Person.prototype.getName = function () {
      return this.name
    }
    const p = new Person('zhangsan')
    for (let key in p) {
      if (p.hasOwnProperty(key)) {
        //是否为自身的属性，而非原型链上的
        // console.log(key, p[key])
      }
    } //class 类

    const obj3 = {
      5: '5',
      1: '2',
      a: 'a',
      '-1': '-1',
      3: '3',
      b: 'b',
    }

    for (let key in obj3) {
      // console.log(key, obj3[key])
    }

    // Object.keys() //获取对象自身的可枚举的属性,不包含原型链上的可枚举属性和Symbol
    // console.log(Object.keys(obj3)) //会进行，和上面的一样
    Object.keys(obj3).forEach((item) => {
      // console.log(obj3[item])
    })

    //Object.getOwnPropertyNames()  获取对象自身的所有属性名，包括不可枚举的属性，不包含原型链上的属性和symbol属性
    let one = Object.getOwnPropertyNames(obj)
    // console.log(one)
    one.forEach((item) => {
      // console.log(obj[item])
    })

    //判断属性是否可枚举Object.getOwnPropertyDescriptor()
    //Object.prototype.propertyIsEnumerable()
    let two = Object.getOwnPropertyDescriptor(obj, 'foo')
    let three = Object.getOwnPropertyDescriptor(obj, 'name')

    // console.log(two)
    // console.log(three)

    // Object.getOwnPropertySymbols()  //获得对象自身的所有symbol属性，不包括原型链上的Symbol
    let four = Object.getOwnPropertySymbols(obj)
    // console.log(four)

    Reflect.ownKeys() //获取对象自身的所有属性，包括不可枚举+Symbol属性

  </script>
</body>

</html>